#include <iostream>
using std::cout;
using std::endl;

//函数模板
template <class T>
T add(T t1, T t2)
{
    return t1 + t2;
}

#if 0
//编译器在走到模板被使用的语句时
//会生成一个模板函数（实例化）
short add(short x,short y){
    return x + y;
}
#endif

void test0(){
    short s1 = 1, s2 = 2;
    int i1 = 3, i2 = 4;
    long l1 = 5, l2 = 6;
    double d1 = 1.4, d2 = 2.8;
    
    //隐式实例化
    //根据传入的参数类型推导出T应该是什么类型
    //生成相应的模板函数
    cout << "add(s1,s2): " << add(s1,s2) << endl;
    cout << "add(i1,i2): " << add(i1,i2) << endl;
    cout << "add(l1,l2): " << add(l1,l2) << endl;

    //显式实例化
    //指明了T应该是什么类型
    //生成了确定的模板函数
    cout << "add(d1,d2): " << add<int>(d1,d2) << endl;  

    //没有匹配的模板
    /* cout << add(s1,i2) << endl; */
    //显式实例化可以通过
    cout << add<int>(s1,i2) << endl;
    //精度损失
    cout << add<int>(d1,i2) << endl;
}

int main(void){
    test0();
    return 0;
}
